package main

import (
	"fmt"
)

type Strategy interface {
	Execute() string
}

type NormalStrategy struct{}

func (n *NormalStrategy) Execute() string {
	return "Executing normal strategy"
}

type SpecialStrategy struct{}

func (s *SpecialStrategy) Execute() string {
	return "Executing special strategy"
}

type Context struct {
	strategy Strategy
}

func (c *Context) SetStrategy(strategy Strategy) {
	c.strategy = strategy
}

func (c *Context) ExecuteStrategy() string {
	return c.strategy.Execute()
}

func main() {
	context := &Context{}

	normalStrategy := &NormalStrategy{}
	context.SetStrategy(normalStrategy)
	fmt.Println(context.ExecuteStrategy())

	specialStrategy := &SpecialStrategy{}
	context.SetStrategy(specialStrategy)
	fmt.Println(context.ExecuteStrategy())
}
